package it.fantacalcio.hibernate.dao;

import it.fantacalcio.model.Giocatore;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

public class GiocatoreDAOImpl extends BaseHibernateDAO implements GiocatoreDAO {


	@Override
	public void save(Giocatore giocatore) throws Exception {
		getSession().save(giocatore);
	}
	
	@Override
	public void delete(Giocatore giocatore) throws Exception {
		getSession().delete(giocatore);
	}
	
	@Override
	public void update(Giocatore giocatore) throws Exception {
		getSession().saveOrUpdate(giocatore);		
	}
	
	@Override
	public Giocatore get(Long id) throws Exception {
		return (Giocatore) getSession().get(Giocatore.class, id);
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<Giocatore> list() throws Exception {
		Criteria cri = getSession().createCriteria(Giocatore.class);
		cri.addOrder(Order.asc("cognome"));
		List<Giocatore> results = cri.list();
		return results;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<Giocatore> findByExample(Giocatore giocatore) throws Exception {
		Criteria cri = getSession().createCriteria(Giocatore.class);
		cri.add(Example.create(giocatore).ignoreCase());
		if(giocatore.getSquadra()!=null){
			cri.add(Restrictions.eq("squadra", giocatore.getSquadra()));
		}
		cri.addOrder(Order.desc("ruolo"));
		List<Giocatore> results = cri.list();
		return results;
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<Giocatore> search(Giocatore giocatore,
			Integer rangeValore) throws Exception {
		
		Criteria cri = getSession().createCriteria(Giocatore.class);
		cri.add(Example.create(giocatore).ignoreCase());
		if(giocatore.getSquadra()!=null){
			cri.add(Restrictions.eq("squadra", giocatore.getSquadra()));
		}
		if(rangeValore!=null){
			switch (rangeValore) {
				case 1: cri.add(Restrictions.between("valore", 0, 20));break;
				case 2: cri.add(Restrictions.between("valore", 21, 40));break;
				case 3: cri.add(Restrictions.between("valore", 41, 60));break;
				case 4: cri.add(Restrictions.between("valore", 61, 80));break;
				case 5: cri.add(Restrictions.between("valore", 81, 100));break;
				case 6: cri.add(Restrictions.between("valore", 101, 1000));break;
			}
		}
		cri.addOrder(Order.asc("cognome"));
		List<Giocatore> results = cri.list();
		return results;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<String> listaSquadreReali() throws Exception {
		String queryString = "select distinct squadraReale from Giocatore order by squadraReale asc";
		Query queryObject = getSession().createQuery(queryString);
		return queryObject.list();
	}
	
	@Override
	public void deleteAll() throws Exception {
		String queryString = "delete from Giocatore";
		Query queryObject = getSession().createQuery(queryString);
		queryObject.executeUpdate();
	}
}
